
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Nginx 缓存机制 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Nginx 缓存机制 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Nginx 缓存机制主要带来了哪些核心优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nginx 缓存机制的核心优势包括四个方面：1. 提高访问速度：直接从缓存返回内容，减少请求处理时间。2. 减轻服务器负载：减少对后端服务器的请求压力。3. 提升用户体验：快速响应能减少用户等待时间，降低流失率。4. 节省带宽成本：减少对后端服务器的请求次数，降低网络带宽占用。</div>
          </div>
          <div class="card-source">来源: 什么是 Nginx 缓存</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请简述 Nginx 缓存的工作流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当接收到客户端请求时，Nginx 首先根据请求的 URL 等条件检查缓存中是否存在该资源的副本。如果存在（命中缓存），则直接返回缓存的内容。如果不存在，Nginx 会向后端服务器请求资源，并将获取到的资源保存在缓存中，然后再返回给客户端，以备下次相同请求使用。</div>
          </div>
          <div class="card-source">来源: Nginx 缓存的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 Nginx 缓存中，“缓存键”（Cache Key）的作用是什么？它通常由哪些信息组成？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“缓存键”是用来唯一标识缓存内容的标识符。Nginx 根据缓存键来查找对应的缓存内容。通常情况下，缓存键是由请求的 URL 和其他相关信息（如请求的方法、Host 头、查询参数等）组成的。</div>
          </div>
          <div class="card-source">来源: Nginx 缓存的工作原理 - 缓存的存储结构和缓存键</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Nginx 的代理缓存（Proxy Cache）和 FastCGI 缓存主要区别是什么？它们分别适用于什么场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要区别在于数据来源：代理缓存的数据来自后端服务器（如静态文件、动态内容），而 FastCGI 缓存的数据来自 FastCGI 进程（如 PHP-FPM）。代理缓存适用于缓存后端服务器的通用响应，如静态文件、API接口等。FastCGI 缓存则专门适用于缓存动态页面，如由 PHP、Python 等脚本生成的页面。</div>
          </div>
          <div class="card-source">来源: 缓存的类型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">在 Nginx 配置中，`proxy_cache_path` 指令的关键作用和包含的主要参数有哪些？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`proxy_cache_path` 指令用于定义缓存的存储路径及相关参数。其主要参数包括：缓存文件的存储路径（例如 /var/cache/nginx）、目录层级（levels）、用于存储缓存键的共享内存区域名称和大小（keys_zone）、缓存最大容量（max_size）以及非活跃时间（inactive），超过该时间未被访问的缓存将被清理。</div>
          </div>
          <div class="card-source">来源: 缓存配置</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">如何通过 Nginx 配置实现有条件地绕过缓存或不缓存某些响应？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过两个指令来控制：1. `proxy_cache_bypass`：该指令定义了一些条件，如果条件为真，Nginx 将直接从后端服务器获取响应而不查询缓存。2. `proxy_no_cache`：该指令定义了一些条件，如果条件为真，Nginx 将不会把从后端获取的响应存入缓存。</div>
          </div>
          <div class="card-source">来源: 缓存控制 - 设置缓存的条件（proxy_cache_bypass 和 proxy_no_cache）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到了哪两种手动清除 Nginx 缓存的方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到了两种手动清除缓存的方法：1. 直接删除存储路径下的缓存文件。2. 使用 `proxy_cache_purge` 模块，通过配置一个特定的 location，当访问该 location 对应的 URL 时，即可清除指定 URL 的缓存。</div>
          </div>
          <div class="card-source">来源: 缓存的更新和清除 - 手动清除缓存</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在缓存动态内容时，可以采用哪些策略来保证缓存与后端数据的一致性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">保证动态内容缓存一致性的策略包括：1. 设置合适的缓存策略，如较短的有效期。2. 建立缓存失效机制，当后端内容更新时触发缓存失效或清除。3. 使用 HTTP 头（如 Cache-Control, Last-Modified, ETag）来精确控制缓存行为。</div>
          </div>
          <div class="card-source">来源: 缓存与动态内容</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">安全</div>
          <div class="card-question">配置 Nginx 缓存时，为防止敏感信息泄露和缓存劫持，应考虑哪些安全措施？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">安全</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">应考虑的安全措施包括：1. 对包含敏感信息的页面设置不缓存或短暂缓存策略。2. 对缓存内容中的敏感信息进行动态处理或加密。3. 使用 HTTPS 协议保护数据传输安全，并确保只缓存加密内容。4. 限制对缓存内容的访问权限。5. 定期监控和审计缓存访问情况。</div>
          </div>
          <div class="card-source">来源: 安全性考虑</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
